
const fp = require('lodash/fp')
const { Container, Maybe } = require('./support')

//练习1 使用fp.add(x,y) 和fp.map(f,x)创建一个能让functor里的值增加的函数ex1
//Maybe实例有 map 传入一个函数来处理在实例存入的数组，因此使用fp.map遍历数组，将每个值传给fp.add进行相加，最后返回处理完的数组
let maybe = Maybe.of([5, 6, 1])
let ex1 = (x) => maybe.map(fp.map(fp.add(x)))
console.log(ex1(2))

//练习2 实现一个函数ex2 ，能够使用fp.first 获取列表的第一个元素
//使用Container的map方法可以往里面传入一个函数来处理实例传入的值，因此将fp.first传入map即可
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = () => xs.map(fp.first)
console.log(ex2())

//练习3实现一个函数ex3,使用safeProp和fp.first 找到user的名字的首字母
//这里safeProp先进行了柯里化，根据内部实例传入的数据格式可以分析得出，o作为一个对象，x作为一个属性或者下标，所以看需要处理的数据user就是一个含有name的对象，按照柯里化入参的顺序，我们先缓存出一个传入name的函数safePropName，然后再safePropName传入对象user后返回一个函子，利用函子的map我们再传入fp.first处理得到名字
let safeProp = fp.curry(function (x, o) {
  return Maybe.of(o[x])
})
let user = { id: 2, name: 'Albert' }
let safePropName = safeProp('name');
let ex3 = (user) => safePropName(user).map(fp.first)
console.log(ex3(user))


//练习4 用Maybe 重写ex4 不要有if语句
//原ex4 
// let ex4 = function (n) {
//   if (n) {
//     return parseInt(n)
//   }
// }
//判断n是否存在。存在返回parseInt处理后的值，这里其实就是Maybe函子中isNothing在map中的使用，因此直接将参数入Maybe.of进行实例，然后接上用map来处理传入的值
let ex4 = (n) => Maybe.of(n).map(parseInt)
console.log(ex4())